iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
0

最後一篇簡短的介紹 channels 。

說到 Channels ,得先談到 WebSocket,WebSocket 與一般 HTTP 最大的不同點是,透過 WebSocket 協定,服務器端可以主動向客戶端瀏覽器推送資料,也就是說服務器端不再是被動等待 HTTP 請求才能做事了。客戶端瀏覽器也因此可以跟服務器端做永久連接,並進行雙向的資料傳輸。

Django 原本只有單純的 HTTP 能力,也就是只能被動等待 HTTP 請求,做出回應。透過 Channels 的擴充,讓 Django 可以處理 WebSockets 或是 IoT (MQTT)等協定。

專案網址:https://channels.readthedocs.io/en/latest/

教學文件:https://channels.readthedocs.io/en/latest/tutorial/index.html

基本上依照教學,很快就可以完成簡單的聊天室。所以這邊我不多做著墨,而是講一下佈署的部份。

照一般 Django 應用程式來說,使用 gunicorn 就可以了,但用了 channels 以後,則需要啟動一個 ASGI Server - daphne 。daphne 除了可以處理 HTTP/WSGI 請求之外,也可以處理 ASGI 請求。不過,daphne 處理 HTTP/WSGI 請求的效能不是非常好,我自己在使用時,仍然把 HTTP/WSGI 請求轉給 gunicorn 來處理。

那這樣做的缺點就是 nginx 得多寫設定,讓 WebSocket 的請求到 daphne 那邊去,原來的 HTTP 請求到 gunicorn 那邊去。

# nginx config example
    location @proxy_to_ws {
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Connection "";
        proxy_redirect off;
        proxy_read_timeout 300s;

        proxy_pass   http://daphne_server;

        # For websocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location @proxy_to_app {
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Connection "";
        proxy_redirect off;
        proxy_read_timeout {{app_proxy_read_timeout}}s;

        proxy_pass   http://gunicorn_server;

        proxy_http_version 1.1;
    } 

再來就是 WebSocket 的連線是持續的,從這點來考量,就需要考慮以下幾點:

  1. 在做橫向擴展的時候要考慮佈署對象的支援程度與如何設定。
  2. 機器的最大可連線數與負載平衡問題。
  3. WebSocket 連線的逾時機制。

大致上就是這樣子,有時間再來把這邊寫的更詳細些。

結語

轉眼,九月也到 30 日,也順利的把以前用過的套件都整理過一次。最後,謝謝大家的閱讀,如果有不好的地方請不吝留言告知,謝謝。


上一篇
29. bootstrap-admin
系列文
加速你的 Django 網站開發 - Django 的好用套件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言